package com.chaodev.base.utils.security;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

import java.nio.charset.StandardCharsets;

/**
 * Rsa额外实现类，使用hutool库
 */
public class RsaExtraHelper {
    /**
     * 公钥加密
     * @param data 数据
     * @param publicKey 公钥
     * @return 密文
     */
    public static String encodeWithPublicKey(String data,String publicKey) {
        RSA rsa = new RSA(null,publicKey);
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(data, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
        return  Base64Helper.encodeBase64(encrypt);
    }
    /**
     * 公钥加密
     * @param data 数据
     * @param publicKey 公钥
     * @param encodeMode RSA/ECB/PKCS1Padding或者RSA/None/NoPadding
     * @return 密文
     */
    public static String encodeWithPublicKey(String data,String publicKey,String encodeMode) {
        RSA rsa = new RSA(encodeMode,null,publicKey);
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(data, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
        return  Base64Helper.encodeBase64(encrypt);
    }

    /**
     * 私钥解密
     * @param data 数据
     * @param privateKey 私钥
     * @return 明文
     */
    public static String decodeWithPrivateKey(String data,String privateKey)  {
        byte[] byteData=Base64Helper.decodeBase64Byte(data);
        RSA rsa = new RSA(privateKey,null);
        byte[] encrypt = rsa.decrypt(byteData, KeyType.PrivateKey);
        return  new String(encrypt, StandardCharsets.UTF_8);
    }

    /**
     * 私钥解密
     * @param data 数据
     * @param privateKey 私钥
     * @param encodeMode RSA/ECB/PKCS1Padding或者RSA/None/NoPadding
     * @return 明文
     */
    public static String decodeWithPrivateKey(String data,String privateKey,String encodeMode)  {
        byte[] byteData=Base64Helper.decodeBase64Byte(data);
        RSA rsa = new RSA(encodeMode,privateKey,null);
        byte[] encrypt = rsa.decrypt(byteData, KeyType.PrivateKey);
        return  new String(encrypt, StandardCharsets.UTF_8);
    }

    /**
     * 使用私钥加密
     * @param data 明文
     * @param privateKey 秘钥
     * @return 密文
     */
    public static String encodeWidthPrivateKey(String data,String privateKey){
        RSA rsa = new RSA(privateKey,null);
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(data, CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
        return  Base64Helper.encodeBase64(encrypt);
    }

    /**
     * 使用私钥加密
     * @param data 明文
     * @param privateKey 秘钥
     * @param encodeMode RSA/ECB/PKCS1Padding或者RSA/None/NoPadding
     * @return 密文
     */
    public static String encodeWidthPrivateKey(String data,String privateKey,String encodeMode){
        RSA rsa = new RSA(encodeMode,privateKey,null);
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(data, CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
        return  Base64Helper.encodeBase64(encrypt);
    }

    /**
     * 使用公钥解密
     * @param data 密文
     * @param publicKey 公钥
     * @return 明文
     */
    public static String decodeWithPublicKey(String data,String publicKey)  {
        byte[] byteData=Base64Helper.decodeBase64Byte(data);
        RSA rsa = new RSA(null,publicKey);
        byte[] encrypt = rsa.decrypt(byteData, KeyType.PublicKey);
        return  new String(encrypt,StandardCharsets.UTF_8);
    }

    /**
     * 使用公钥解密
     * @param data 密文
     * @param publicKey 公钥
     * @param encodeMode RSA/ECB/PKCS1Padding或者RSA/None/NoPadding
     * @return 明文
     */
    public static String decodeWithPublicKey(String data,String publicKey,String encodeMode)  {
        byte[] byteData=Base64Helper.decodeBase64Byte(data);
        RSA rsa = new RSA(null,publicKey);
        byte[] encrypt = rsa.decrypt(byteData, KeyType.PublicKey);
        return  new String(encrypt,StandardCharsets.UTF_8);
    }
}
